\chapter{Especificações e a implementação}
\label{cap:spec}

Neste capítulo especificamos os quadros que representam os formatos das mensagens
(\textit{tokens} de permissão e especiais, trocados entre nódos), temporizadores, e apresentamos diagramas e particularidades 
da implementação da ``prova de conceito''.

\section{Especificação de quadros de \textit{tokens}}

%Cada campo de um determinado quadro é representado em \textit{bytes} de acordo com primitivas numéricas em Java.
\begin{enumerate}

\item \textit{Token} Deletado\\
Para evitar que um \textit{token} (em um varal ou anel) seja recuperado, o valor 00000000 é atribuído ao campo FC de um \textit{token}.

\item \textit{Token} Normal\\
\begin{tabular}{|c|c|c|c|c|c|c|c|}
\hline
00000001 & RA & DA & SA & NoN & Gen\_Seq & Coord\_Seq & Seq\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8}\\
\end{tabular}\\

Permite ao nó portador utilizar com exclusividade os recursos compartilhados e disponíveis no anel com RA.

\item \textit{Token} de eleição\\
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
00000010 & RA & DA & SA & MAX\_POWER & MAX\_ID & participantes\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{8}\\
\end{tabular}\\

Permite eleger proprietário de um anel. O nó que contém ID igual a MAX\_ID é eleito proprietário.

\item Aviso de proprietário eleito\\
\begin{tabular}{|c|c|c|c|c|}
\hline
00000011 & RA & DA & SA & ELECTED\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Passa de nó em nó anunciando que o nó cujo ID é igual a ELECTED, foi eleito proprietário ou coordenador do anel.

\item Atribuição de predecessor\\
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
00000100 & RA & DA & SA & NoN & Gen\_Seq & Seq\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8}\\
\end{tabular}\\

Permite que o nó com DA possa ser sucessor do nó com SA. É 
utilizado para inclusão e saída de um nó em um anel.

\item Atribuição de sucessor\\
\begin{tabular}{|c|c|c|c|c|}
\hline
00000101 & SA & RA & SA & NS\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Permite que o nó com DA possa ser predecessor do nó com NS (futuro sucessor).É 
usado para inclusão  e saída de um nó em um anel.

\item Adverte selecionado\\
 \begin{tabular}{|c|c|c|c|}
\hline
00000110 & SA & RA & NS\\
\hline
\end{tabular}\\

Representa o tipo de pacote enviado do nó (com endereço SA) que deseja entrar em um anel
para o nó que ele selecionou dentre os que responderam.

\item \textit{Token} de varal\\
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
00000111 & RA & DA & SA & NoN & Gen\_Seq & Seq\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8}\\
\end{tabular}\\

Permite ao coordenador portador utilizar com exclusividade os recursos compartilhados e disponíveis no anel com RA.

\item \textit{Token} de eleição em um varal\\
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
00001000 & RA & DA & SA & MAX\_POWER & MAX\_ID & participantes\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{8}\\
\end{tabular}\\

Permite eleger um novo proprietário de varal e passa de nó em nó até voltar ao nó que o gerou.

\item Aviso de proprietário eleito em um varal\\
\begin{tabular}{|c|c|c|c|c|}
\hline
00001001 & RA & DA & SA & ELECTED\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Passa de nó em nó anunciando que o nó cujo ID igual a ELECTED, foi eleito proprietário do varal.

\item Atribuição de predecessor em um varal\\
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
00001010 & RA & DA & SA & NoN & Gen\_Seq & Seq\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{8}\\
\end{tabular}\\

Permite que o nó com DA possa ser sucessor do nó com SA. É utilizado para inclusão e saída de um nó em um varal.

\item Atribuição de sucessor em um varal\\
\begin{tabular}{|c|c|c|c|c|}
\hline
00001011 & RA & DA & SA & NS\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Permite que o nó com DA possa ser predecessor do nó com NS (futuro sucessor). É utilizado para inclusão e saída de um nó em um varal.

%\item Pacote de dados em um varal\\
%\begin{tabular}{|c|c|c|c|c|}
%\hline
%00001100 & RA & DA & SA & Data\\
%\hline
%\end{tabular}\\

%Representa pacote de dados em um varal.

\item \textit{Token} de aviso de entrada\\
\begin{tabular}{|c|c|c|c|c|}
\hline
00001101 & RA & DA & SA & ID\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Este \textit{token} é utilizado para avisar que o nó N acabou de entrar no anel cujo endereço é RA. Ele transita de 
sucessor em sucessor até o predecessor do nó com identificador ID.

\item \textit{Token} de aviso de saída\\
\begin{tabular}{|c|c|c|c|c|}
\hline
00001110 & RA & DA & SA & ID\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Este \textit{token} é utilizado para avisar que o nó cujo identificador igual a ID saiu do anel de endereço RA. Ele transita de 
sucessor em sucessor até o predecessor do nó com identificador ID.

\item \textit{Token} de reentrada\\
\begin{tabular}{|c|c|c|c|c|}
\hline
00001111 & RA & DA & SA & ID\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Este \textit{token} é utilizado quando um nó quer enviar ID dele para o sucessor. Sempre que
houver queda inesperada em um anel, este \textit{token} é enviado e recebido entre os 
nós restantes no anel.

\item \textit{Token} de solicitação de entrada em um anel\\
\begin{tabular}{|c|c|c|c|}
\hline
00010000 & RA & Br. & SA\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Um nó utiliza este \textit{token} para solicitar entrada em um anel. O campo RA
é ID desse nó, se esse nó chegou a formar um anel unitário. Senão, RA é um campo com valor inválido (definido).

\item \textit{Token} de solicitação de entrada em um varal\\
\begin{tabular}{|c|c|c|c|}
\hline
00010001 & RA & Br. & SA\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Um nó utiliza este \textit{token} para solicitar entrada em um varal. O campo RA
é endereço do anel a qual o nó pertence.

\item Resposta a mensagem adverte selecionado\\
\begin{tabular}{|c|c|c|c|}
\hline
00010010 & DA & SA & SUCC\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Representa pacote de mensagem de resposta do nó selecionado (com endereço SA) à advertência enviada pelo
nó que deseja ser incluso.

\item \textit{Token} de resposta a solicitação de entrada em um anel\\
\begin{tabular}{|c|c|c|c|}
\hline
00010100 & DA & SA & MY\_SUCC\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Esse \textit{token} é enviado em resposta a solicitação de entrada do nó com endereço DA em um anel.

\item \textit{Token} de resposta a solicitação de entrada em um varal\\
\begin{tabular}{|c|c|c|c|}
\hline
00010101 & DA & SA & MY\_SUCC\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Esse \textit{token} é enviado em resposta a solicitação de entrada feita pelo nó com endereço DA em um anel.

\item \textit{Token} de alerta de saída de um coordenador\\
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
00010110 & RA & Br. & SA & PRED\_V & SUCC\_V & SUCC\\
\hline
\multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} &
\multicolumn{1}{c}{2} & \multicolumn{1}{c}{2} & \multicolumn{1}{c}{2}\\
\end{tabular}\\

Um coordenador cessante, que possui sucessor SUCC no anel RA, predecessor PRED\_V e sucessor SUCC\_V no varal,
faz um \textit{broadcast} desse \textit{token} avisando a sua saída.
\end{enumerate}

\section{Implementação}
Nesta seção apresentamos algumas particularidades de como foi feita
a implementação considerando o ambiente utilizado para teste.

\subsection{Definições e constantes}
\begin{itemize}
 \item Número de nó por anel
 \item Número máximo de nó em todo o cenário
 \item Tempo normal de apreensão de \textit{token}
 \item Tempo máximo de apreensão de \textit{token}
 \item Tempo de monitoramento de \textit{token}
 \item Número de tentativa de passar \textit{token}
 \item Tempo que um nó espera para receber \textit{token}
\end{itemize}


\subsection{Solicitação de entrada}
No trabalho apresentado em~\cite{ergenthesis}, algum nó em anel é que inicia o procedimento de
entrada para os nódos interessados enviando uma mensagem \textit{broadcast} a que os nódos
interessados respondem enviando candidatura.

\subsection{Transmissão de \textit{Token}}


\subsection{Relação entre as classes}